package com.example.project.key.connection;

import android.util.Log;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class DBUtils {
    private static final String  TAG="DBUtils";//    用于日志打印
    private static Connection conn=null;//    定义连接变量conn

    //数据库连接函数
    public static Connection getConnection(String dbname) {//定义connection类函数，需要返回一个connection对象，即在上面定义的conn
        String user = "rcapp";//打开Navicat，点击用户，如果显示root@localhost，请修改为root@%或新加一个root@%，%表示任意，任意ip地址都可以连接
        String password = "Dai201908";//密码
        String url = "jdbc:mysql://rm-7xv0w19cvdz7ibm5bao.mysql.rds.aliyuncs.com/projectb?useUnicode=true&characterEncoding=UTF-8&useSSL=false";
//        "?useUnicode=true&characterEncoding=UTF-8"添加中文信息时不会乱码

//       注册JDBC驱动的固定语句
        try {

            Class.forName("com.mysql.jdbc.Driver");//这是一个目录，你可以找到这个目录点进去就懂了
            Log.d(TAG, "加载JDBC驱动成功");
        } catch (ClassNotFoundException e) {
            Log.d(TAG, "加载JDBC驱动失败");
        }


//        创建与mysql的连接对象conn,当然你也可以直接把上面定义的那些变量url的值直接写进去，就不用上面写一堆定义
        try {
            conn = DriverManager.getConnection(url, user, password);
            Log.d(TAG, "数据库连接成功");

        } catch (SQLException e) {
            Log.d(TAG, "数据库连接失败");
        }

        return  conn;//connection类，返回一个connection连接对象
    }

    //数据库查询函数
//前面加载完JDBC驱动了，现在开始使用JDBC，
    //↓ List里只能放Map类型的对象，而这个Map类型的对象又只能放以String类型为键，以Object类型为值的键值对
    //就是说你定义了一个表list，然后表里得每一行数据都是HashMap，然后HashMap<标识符,你要保存的数据>
    public static List<HashMap<String,Object>> getinfo(String dbname) throws SQLException {

//       定义List<HashMap<String,Object>>类型的数据并实例化
        List<HashMap<String,Object>> list=new ArrayList<HashMap<String, Object>>();

//        调用连接函数，传入数据库名的形参，获得conn对象，因为getConnection的返回类型就是Connection及conn
        //1.调用连接，不然你连不上数据库
        Connection conn=getConnection(dbname);

//        通过connection对象conn获取statement对象sta，createStatement()：创建基本的statement对象
        //2.你要用statement去执行sql语句，但你得连上数据库才能执行，所以要用连接对象创建statement对象。
        Statement sta=conn.createStatement();

//        定义sql语句
        String sql="SELECT * FROM `mission` ORDER BY mt asc";

//        调用Statement对象执行sql语句,返回结果为结果集，就是一个带指针的表格，通过操作指针来进行数据操作
        //3.使用statement的三种方法中的executeQuery()方法，返回的就是一个结果集ResultSet对象，所以你要用ResultSet变量接收
        ResultSet result=sta.executeQuery(sql);

//        判断一下是否为空
        if (result==null){
            return null;
        }
        int i=0;
//        当这个结果集（就这个表）还有下一行时进入函数。这个表是有指针的，百度搜索ResultSet接口中的方法，
        while (result.next()) {
//            每次循环都会新实例化一个HashMap对象，用于将遍历到的数据填进去
            HashMap<String,Object> map=new HashMap<>();
            i++;
//            往map中填数据，map的数据类型相当于键值对
            map.put("mission",result.getString("mission"));//ResultSet中的getString方法，获取指定字段的String类型值
            map.put("mission_num",result.getInt("mission_num"));
            map.put("mt",result.getString("mt"));
            map.put("company",result.getString("company"));
            map.put("number",i);
//            每次循环完就添加到list中
            list.add(map);
        }
//        把list返回出去，否则拿不到这个list
        return list;
    }

}
